home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 July / Macworld (1999-07).dmg / Shareware World / Info / For Developers / Mops 3.4.sea / Mops source / Module source / DialogMod.txt < prev    next >
Text File  |  1997-12-09  |  5KB  |  195 lines

  1. \ Dialog class.
  2.  
  3. \ July 91  mrh    Moved to a module, and migrated some methods from Dialog+.
  4. \ Jan  95  mrh  Removed CALLER - can't bind to a word name any more
  5. \ Sept 97  mrh    Updated for PowerMops
  6.  
  7.  
  8. \ Class Dialog handles modal dialogs.  For modeless dialogs, use the
  9. \ subclass Dialog+.
  10.  
  11. :class    DIALOG    super{ x-array }
  12. record
  13. {    int        RESID        \ note: not a Toolbox record here!
  14.     ptr        DLGPTR
  15.     var        PROCPTR        \ not a ptr, since we want it initialized to zero
  16.     int        BOLDITEM
  17. }
  18.  
  19. :m DLGPTR:
  20.     inline{ get: dlgPtr}  ;m
  21.  
  22. :m CLOSE:
  23.     nil?: dlgPtr  ?EXIT
  24. [ PPC? ] [IF]
  25.     get: procPtr  ?dup IF  DisposeRoutineDescriptor  THEN
  26. [THEN]
  27.     get: dlgPtr  DisposeDialog
  28.     clear: dlgPtr  ;m
  29.  
  30. :m OPEN?:
  31.     nil?: dlgPtr  ;m
  32.  
  33. :m ITEMHANDLE:  { item# -- hndl }
  34.     get: dlgPtr  item#
  35.     addr: itemType  addr: itemHandle  addr: tempRect
  36.     GetDialogItem
  37.     get: itemHandle  ;m
  38.  
  39. :m DRAWBOLD:
  40.     nil?: dlgPtr  ?EXIT
  41.     get: boldItem  ?dup  0EXIT
  42.     savePort
  43.     get: dlgPtr  SetPort  3 3 PenSize
  44.     itemHandle: self  drop            \ Sets up tempRect
  45.     -4 -4 inset: tempRect
  46.     addr: tempRect  16 16  FrameRoundRect  PenNormal
  47.     restPort  ;m
  48.  
  49. :m GETNEW:
  50.     get: resid  0  -1  GetNewDialog  dup put: dlgPtr
  51.     0= abort" dlg resource not found"
  52.     drawBold: self  ;m
  53.  
  54. :m SETPROC:        \ ( xt -- )  set dialog proc
  55. [ PPC? ] [IF]
  56.     2+        \ I think this will have to change!
  57.     konst uppModalFilterProcInfo  konst kPowerPCISA  NewRoutineDescriptor
  58. [THEN]
  59.     put: procPtr
  60. ;m
  61.  
  62. :m MODAL:
  63.     BEGIN
  64.         get: procPtr  addr: theItem  ModalDialog
  65.         get: theItem 1-  exec: super
  66.         rtm  false -> rtm
  67.     NUNTIL  ;m
  68.  
  69.  
  70. :m PUTITEM:        \ ( val item# -- )
  71.     itemHandle: self  swap SetControlValue  ;m
  72.  
  73. :m GETITEM:        \ ( item# -- val )  Gets value for an item#
  74.     itemHandle: self  GetControlValue  ;m
  75.  
  76. :m PUTRESID:    \ ( resID -- )
  77.     inline{ put: resID}  ;m
  78.  
  79. :m INIT:    \ ( xt1 ... xtN N resID -- )
  80.     put: resID  put: super  ;m
  81.  
  82. :m SETBOLD:    \ ( item# -- )  Causes bold outline of the specified item
  83.     inline{ put: boldItem}  ;m
  84.  
  85. :m GETTEXT:    \ ( item# -- addr len )  Returns a text item's text
  86.     itemHandle: self  buf255  get: ItemType 24 and
  87.     IF  GetDialogItemText  ELSE  GetControlTitle  THEN
  88.     buf255 count  ;m
  89.  
  90. :m PUTTEXT: { addr len item# -- }  \ Stores an item's text
  91.     item#  itemHandle: self
  92.     addr len str255   get: ItemType 24 and
  93.     IF  SetDialogItemText  ELSE  SetControlTitle  THEN  ;m
  94.  
  95. :m SETSELECT:  { start end item# -- }
  96.         \ Sets the selection range for text item
  97.     get: dlgPtr
  98.     item# start end  SelectDialogItemText  ;m
  99.  
  100. :m DRAW:    \ Forces drawing of dialog before going to modal:
  101.     get: dlgPtr  DrawDialog  ;m
  102.  
  103.  
  104. \    ====== Extra methods for manipulating dialog items ======
  105.  
  106.  
  107. :m HIDEITEM:    \ ( item# -- )
  108.     get: dlgPtr  swap  HideDialogItem  ;m
  109.  
  110. :m SHOWITEM:    \ ( item# -- )
  111.     get: dlgPtr  swap  ShowDialogItem  ;m
  112.  
  113. :m DISABLEITEM:    \ ( item# -- )
  114.     itemHandle: self  254  HiliteControl  ;m
  115.  
  116. :m ENABLEITEM:    \ ( item# -- )
  117.     itemHandle: self  0  HiliteControl  ;m
  118.  
  119. :m SETUSERPROC:  { ^proc item# -- }
  120. [ PPC? ] [IF]
  121.     ^proc  konst uppUserItemProcInfo  konst kPowerPCISA  NewRoutineDescriptor
  122.     -> ^proc            \ ***note, we haven't arranged to dispose it yet!
  123. [THEN]
  124.     item#  itemHandle: self  drop
  125.     get: dlgPtr  item#  0  ^proc  addr: tempRect
  126.     SetDialogItem
  127. ;m
  128.  
  129.  
  130. :m HITBOLD:
  131.     get: boldItem  dup  NIF  drop  EXIT  THEN
  132.     1-  exec: self  ;m
  133.  
  134. :m KEY:        \ ( -- b )
  135.         \ Called when a key down event occurs with this dialog's
  136.         \ window active.  Returns false if we've handled the key
  137.         \ here, so no further action is required.  Subclasses can
  138.         \ have customized KEY: methods; here we just provide a
  139.         \ hopefully sensible default action - namely, we treat a
  140.         \ Return or Enter as a click on the bold item, and ignore
  141.         \ all other keys.
  142.  
  143.     msg: fEvent  $ FF and  ( char typed )
  144.     dup 3 =  swap RET =  or
  145.     IF    \ Return or Enter typed - treat as click on bold item
  146.         hitBold: self  false  EXIT
  147.     THEN
  148.     true  ;m
  149.  
  150. :m TITLE:    \ ( addr len -- )
  151.     str255
  152.     get: dlgPtr  swap  SetWTitle  ;m
  153.  
  154. :m MAXX:    \ ( -- x )
  155.     get: dlgPtr  maxX: class_as> window  ;m
  156.  
  157. :m MAXY:
  158.     get: dlgPtr  maxY: class_as> window  ;m
  159.  
  160. :m MOVE:    \ ( x y -- )
  161.     get: dlgPtr  move: class_as> window  ;m
  162.  
  163. :m CENTER:
  164.     get: dlgPtr  center: class_as> window  ;m
  165.  
  166. \            =================
  167.  
  168. :m SHOW:
  169.     get: dlgPtr  ShowWindow  ;m
  170.  
  171. :m HIDE:
  172.     get: dlgPtr  HideWindow  ;m
  173.  
  174. :m SELECT:
  175.     get: dlgPtr  SelectWindow  ;m
  176.  
  177.  
  178. :m CLASSINIT:    \ Initializes default handlers to close the dialog box.
  179.     ['] closer  fill: self  ;m
  180.  
  181. ;class
  182.  
  183.  
  184. : TOGITEM    \ Toggles the check box or radio button
  185.     get: theItem  1 over  ^base getitem: []  -  swap  ^base putitem: []
  186.     returnToModal  ;
  187.  
  188.  
  189. : PARAMTEXT ( addr0 len0 addr1 len1 addr2 len2 addr3 len3 ) { \ p1 p2 p3 -- }
  190.         \ Substitutes Dialog text.
  191.      str255 dup -> p3  count +
  192.     >str255 dup -> p2  count +
  193.     >str255 dup -> p1  count +
  194.     >str255  p1 p2 p3  ZaramText  ;
  195.